import mongoose, {
  Document,
  Schema,
} from 'mongoose';

import {
  IExam,
  IExamRecord,
} from '@shared/types/exam';

/**
 * 考试活动文档接口
 * @description 继承共享类型并添加MongoDB文档特性，用于类型安全的数据操作
 * @extends IExam
 * @extends Document
 */
export interface IExamDocument extends Omit<IExam, '_id'>, Document {}

/**
 * 考试记录文档接口
 * @description 继承共享类型并添加MongoDB文档特性，用于类型安全的数据操作
 * @extends IExamRecord
 * @extends Document
 */
export interface IExamRecordDocument extends Omit<IExamRecord, '_id'>, Document {}

/**
 * 考试活动模式定义
 * @description 定义考试活动的数据结构，包含活动基本信息、时间设置、试卷关联等
 */
const examSchema: Schema = new Schema({
  /**
   * @description 活动名称，用于标识考试活动
   * @type {String}
   * @required true
   */
  exam_name: { type: String, required: true },
  
  /**
   * @description 活动描述，详细说明考试的内容和要求
   * @type {String}
   * @required true
   */
  description: { type: String, required: true },
  
  /**
   * @description 考试开始时间，学生可以开始参与考试的时间
   * @type {Date}
   * @required true
   */
  start_time: { type: Date, required: true },
  
  /**
   * @description 考试结束时间，学生必须在此时间前完成考试
   * @type {Date}
   * @required true
   */
  end_time: { type: Date, required: true },
  
  /**
   * @description 关联的试卷ID，指向具体的试卷
   * @type {ObjectId}
   * @ref Paper
   * @required true
   */
  paper: { 
    type: Schema.Types.ObjectId, 
    ref: 'Paper',
    required: true
  },
  
  /**
   * @description 是否启用此考试活动
   * @type {Boolean}
   * @default true
   */
  is_enabled: { type: Boolean, default: true },
  
  /**
   * @description 参与人数限制，控制考试的参与规模
   * @type {Number}
   * @optional
   */
  participation_limit: { type: Number },
  
  /**
   * @description 是否允许重复考试
   * @type {Boolean}
   * @default false
   */
  allow_retake: { type: Boolean, default: false },
  
  /**
   * @description 创建者ID，指向创建此考试活动的用户
   * @type {ObjectId}
   * @ref User
   * @optional
   */
  creator: { type: Schema.Types.ObjectId, ref: 'User' },
  
  /**
   * @description 创建时间，记录考试活动的创建时间
   * @type {Date}
   * @default Date.now
   */
  create_time: { type: Date, default: Date.now }
});

/**
 * 考试记录模式定义
 * @description 定义学生考试记录的数据结构，包含答题信息、成绩、状态等
 */
const examRecordSchema: Schema = new Schema({
  /**
   * @description 考试用户ID，指向参与考试的学生
   * @type {ObjectId}
   * @ref User
   * @required true
   */
  user_id: { 
    type: Schema.Types.ObjectId, 
    ref: 'User',
    required: true
  },
  
  /**
   * @description 考试活动ID，指向具体的考试活动
   * @type {ObjectId}
   * @ref Exam
   * @required true
   */
  exam_id: { 
    type: Schema.Types.ObjectId, 
    ref: 'Exam',
    required: true
  },
  
  /**
   * @description 考试开始时间，学生实际开始答题的时间
   * @type {Date}
   * @required true
   */
  start_time: { type: Date, required: true },
  
  /**
   * @description 考试提交时间，学生完成并提交考试的时间
   * @type {Date}
   * @optional
   */
  submit_time: { type: Date },
  
  /**
   * @description 用户答案数组，记录学生对每道题的答案选择和题目快照
   * @type {Array}
   */
  answers: [{
    /**
     * @description 题目ID，指向具体的题目
     * @type {ObjectId}
     * @ref Question
     * @required true
     */
    question_id: { 
      type: Schema.Types.ObjectId, 
      ref: 'Question',
      required: true
    },
    /**
     * @description 题目快照，保存题目当时的完整状态
     * @type {Object}
     * @optional
     */
    question_snapshot: {
      content: { type: String },
      type: { type: String },
      options: [{
        symbol: { type: String },
        content: { type: String }
      }],
      correct_answer: [{ type: Number }],
      score: { type: Number },
      difficulty: { type: String }
    },
    /**
     * @description 选择的答案序号数组，支持单选和多选题
     * @type {Array<Number>}
     * @required true
     */
    selected_answers: [{ type: Number, required: true }],
    /**
     * @description 答案是否正确
     * @type {Boolean}
     * @optional
     */
    is_correct: { type: Boolean },
    /**
     * @description 该题得分
     * @type {Number}
     * @optional
     */
    earned_score: { type: Number }
  }],
  
  /**
   * @description 考试得分，系统评分后的总分
   * @type {Number}
   * @optional
   */
  score: { type: Number },
  
  /**
   * @description 考试总分，所有题目的分数总和
   * @type {Number}
   * @optional
   */
  total_score: { type: Number },
  
  /**
   * @description 用户实际得分
   * @type {Number}
   * @optional
   */
  user_score: { type: Number },
  
  /**
   * @description 答对题目数量
   * @type {Number}
   * @optional
   */
  correct_count: { type: Number },
  
  /**
   * @description 答错题目数量
   * @type {Number}
   * @optional
   */
  wrong_count: { type: Number },
  
  /**
   * @description 未作答题目数量
   * @type {Number}
   * @optional
   */
  unanswered_count: { type: Number },
  
  /**
   * @description 是否因超时结束考试
   * @type {Boolean}
   * @default false
   */
  is_timeout: { type: Boolean, default: false },
  
  /**
   * @description 考试状态
   * @type {String}
   * @enum ['in_progress', 'completed', 'timeout']
   * @default 'in_progress'
   */
  status: { 
    type: String, 
    enum: ['in_progress', 'completed', 'timeout'], 
    default: 'in_progress'
  }
});

/**
 * 导出考试活动模型
 * @description MongoDB模型，用于操作考试活动相关数据
 * @type {Model<IExamDocument>}
 */
export const Exam = mongoose.model<IExamDocument>("Exam", examSchema);


/**
 * 导出考试记录模型
 * @description MongoDB模型，用于操作考试记录相关数据
 * @type {Model<IExamRecordDocument>}
 */
export const ExamRecord = mongoose.model<IExamRecordDocument>("ExamRecord", examRecordSchema);
